home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Archives / ForCLI / MCommands_1_0.lha / Src / examine.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-03-19  |  4.0 KB  |  184 lines

  1. #define __USE_SYSBASE
  2.  
  3. #include <exec/types.h>
  4. #include <exec/execbase.h>
  5. #include <exec/memory.h>
  6. #include <dos/rdargs.h>
  7. #include <dos/dos.h>
  8. #include <dos/dosasl.h>
  9. #include <dos/dosextens.h>
  10. #include <datatypes/datatypes.h>
  11. #include <datatypes/datatypesclass.h>
  12. #include <support/types.h>
  13. #include <support/exec.h>
  14.  
  15. #include <string.h>
  16.  
  17. #include <proto/exec.h>
  18. #include <proto/dos.h>
  19. #include <proto/datatypes.h>
  20.  
  21. #include "examine.rev.h"
  22.  
  23. #define DOS_NAME        "dos.library"
  24. #define DOS_VERN         37L
  25. #define DT_NAME            "datatypes.library"
  26. #define DT_VERN            39L
  27.  
  28. #define TEMPLATE        "FILE/M,GROUPID=G/K,TYPEID=T/K,FULL/S,ID/S,ALL/S"
  29.  
  30. STATIC CONST TEXT VersionString[]=
  31.     VERSION(PROG_NAME,PROG_VERSION,PROG_REVISION,PROG_DATE);
  32.  
  33. #define OPT_FILE        0
  34. #define OPT_GID            1
  35. #define OPT_TID            2
  36. #define OPT_FULL        3
  37. #define OPT_ID            4
  38. #define OPT_ALL            5
  39. #define OPT_COUNT        6
  40.  
  41. #define NAME_SIZE        32
  42. #define PATH_SIZE        256
  43. #define LONG_SIZE        5
  44.  
  45. STATIC VOID L2S(STRPTR buffer, ULONG x);
  46.  
  47. ULONG ExamineDT(VOID)
  48. {
  49.     struct ExecBase *SysBase=*((struct ExecBase **)4);
  50.     struct DosLibrary *DOSBase;
  51.     struct Library *DataTypesBase;
  52.  
  53.     STATIC CONST STRPTR NoArgs[]={"#?",NULL};
  54.  
  55.     struct RDArgs *Args;
  56.     struct AnchorPath *Anchor;
  57.     struct DataType *DT;
  58.     struct DataTypeHeader *DTH;
  59.     LONG Opts[OPT_COUNT];
  60.     ULONG TempRC,RC=RETURN_FAIL;
  61.     CHAR FName[NAME_SIZE],GroupID[LONG_SIZE],ID[LONG_SIZE];
  62.     STRPTR CurArg,*ArgPtr;
  63.     BPTR CurrLock,OldLock,Handle;
  64.     BOOL ErrOccured=FALSE;
  65.  
  66.     if(!(DOSBase=(struct DosLibrary *)OpenLibrary(DOS_NAME,DOS_VERN)))
  67.     {
  68.         SetResult2(ERROR_INVALID_RESIDENT_LIBRARY);
  69.         goto InvalidDOS;
  70.     }
  71.  
  72.     if(!(DataTypesBase=OpenLibrary(DT_NAME,DT_VERN)))
  73.     {
  74.         SetResult2(ERROR_INVALID_RESIDENT_LIBRARY);
  75.         goto InvalidDataTypes;
  76.     }
  77.  
  78.     if(!(Anchor=AllocVec(sizeof(struct AnchorPath)+PATH_SIZE,MEMF_CLEAR)))
  79.     {
  80.         PrintFault(IoErr(),NULL);                                /* Inform user */
  81.         goto NoMemory;
  82.     }
  83.  
  84.     clear(&Opts);
  85.     if(!(Args=ReadArgs(TEMPLATE,Opts,NULL)))
  86.     {
  87.         PrintFault(IoErr(),NULL);                                /* Inform user */
  88.         goto NoArgs;
  89.     }
  90.  
  91.     ArgPtr=Opts[OPT_FILE] ? (STRPTR *)Opts[OPT_FILE] : (STRPTR *)NoArgs;
  92.     while(CurArg=*ArgPtr++)
  93.     {
  94.         clear(Anchor);
  95.         Anchor->ap_Strlen=PATH_SIZE;
  96.         Anchor->ap_BreakBits=SIGBREAKF_CTRL_C;        /* Allow break */
  97.  
  98.         TempRC=MatchFirst(CurArg,Anchor);
  99.         while(TempRC==0)
  100.         {
  101.             strcpy(FName,Anchor->ap_Info.fib_FileName);
  102.             if(Anchor->ap_Info.fib_DirEntryType>=0)
  103.             {
  104.                 if(Opts[OPT_ALL])
  105.                 {
  106.                     if(!ftst(Anchor->ap_Flags,APF_DIDDIR))
  107.                         fset(Anchor->ap_Flags,APF_DODIR);
  108.                     fclr(Anchor->ap_Flags,APF_DIDDIR);
  109.                 }
  110.                 goto Next;
  111.             }
  112.             CurrLock=DupLock(Anchor->ap_Current->an_Lock);
  113.             OldLock=CurrentDir(CurrLock);
  114.             if(Handle=Lock(FName,ACCESS_READ))
  115.             {
  116.                 if(DT=ObtainDataTypeA(DTST_FILE,(APTR)Handle,NULL))
  117.                 {
  118.                     DTH=DT->dtn_Header;
  119.                     L2S(GroupID,DTH->dth_GroupID);
  120.                     L2S(ID,DTH->dth_ID);
  121.                     if(Opts[OPT_GID] && strcmp(GroupID,(STRPTR)Opts[OPT_GID]))
  122.                         goto Release;
  123.                     if(Opts[OPT_TID] && strcmp(ID,(STRPTR)Opts[OPT_TID]))
  124.                         goto Release;
  125.                     if(Opts[OPT_FULL])
  126.                         Printf("%s\n",Anchor->ap_Buf);
  127.                     else
  128.                         Printf("%-30s ",FName);
  129.                     Printf("%-12s %-16s",GetDTString(DTH->dth_GroupID),DTH->dth_Name);
  130.                     if(Opts[OPT_ID])
  131.                         Printf(" %-4s %-4s",GroupID,ID);
  132.                     PutStr("\n");
  133. Release:
  134.                     ReleaseDataType(DT);
  135.                 }
  136.                 else
  137.                 {
  138.                     ErrOccured=TRUE;
  139.                     PrintFault(IoErr(),NULL);
  140.                 }
  141.                 UnLock(Handle);
  142.             }
  143.             else
  144.             {
  145.                 ErrOccured=TRUE;
  146.                 PrintFault(IoErr(),NULL);
  147.             }
  148.             CurrentDir(OldLock);
  149.             UnLock(CurrLock);
  150. Next:
  151.             TempRC=MatchNext(Anchor);
  152.         }
  153.         if(TempRC==ERROR_NO_MORE_ENTRIES)
  154.             RC=(ErrOccured ? RETURN_ERROR : RETURN_OK);
  155.         else
  156.         {
  157.             PrintFault(TempRC,NULL);
  158.             RC=(TempRC==ERROR_BREAK ? RETURN_WARN : RETURN_FAIL);
  159.         }
  160.         MatchEnd(Anchor);
  161.         if(TempRC==ERROR_BREAK)
  162.             break;
  163.     }
  164.  
  165.     FreeArgs(Args);
  166. NoArgs:
  167.     FreeVec(Anchor);
  168. NoMemory:
  169.     CloseLibrary(DataTypesBase);
  170. InvalidDataTypes:
  171.     CloseLibrary((struct Library *)DOSBase);
  172. InvalidDOS:
  173.     return(RC);
  174. }
  175.  
  176. STATIC VOID L2S(STRPTR buffer, ULONG x)
  177. {
  178.     ULONG I;
  179.  
  180.     for(I=0; I<4; I++)
  181.         buffer[I]=x >> ((3-I) << 3);
  182.     buffer[I]='\0';
  183. }
  184.